import MinRequest from '@/utils/MinRequest.js';
import store from '@/store/index.js';
import Setting from '@/setting';
import util from '@/libs/util.js';

// token过期重新登录
// async function getToken (res) {
// 	let { apiUrl, method, data, loading } = res.config
// 	method = method.toLowerCase()
// 	await store.dispatch('login/geToken')
// 	// 重新请求接口
// 	return service[method](apiUrl, data, {loading:true})
// }

let update = false; // 是否需要重新登录更新token

// 请求错误处理
function errorCreate (error) {
	const { retmsg } = error
	uni.showToast({ icon: 'none', title: retmsg })
}

const service = new MinRequest();

// 设置默认配置
service.setConfig((config) => {
	config.baseURL = Setting.apiBaseURL // 接口请求地址
	config.timeout = Setting.timeout // 超时时间，单位 ms
	return config
})

// 请求拦截器
service.interceptors.request(async (config) => {
	let token = store.state.login.token
	// 配置请求header
	config.header = {
		'content-type': 'application/x-www-form-urlencoded',
		'access_token': token
	}
	
	if (config.loading) { uni.showLoading({ mask: true, title: 'loading···' }) }
	return config
})

// 响应拦截器
service.interceptors.response((response) => {
	if (response.statusCode || response.config.loading) { uni.hideLoading() }
	if ( response.statusCode === 200 ) {
		// dataAxios 是 service 返回数据中的 data
		const dataAxios = response.data
		// 这个状态码是和后端约定的
		const { retcode } = dataAxios;
		if (retcode === 1) {
			return dataAxios;
		} else if (!update && retcode === 4077) {
			// 重新登录
			update = true
			uni.navigateTo({ url: '/pages/login/login' })
			store.commit('login/REMOVE_TOKEN')
			setTimeout(()=>{
				update = false
			}, 2000)
		} else if (retcode === 4057) {
			uni.navigateTo({
				url: '/pages/bind-phone/bind-phone?type=request'
			})
		} else {
			errorCreate(dataAxios)
			return Promise.reject(dataAxios);
		}
	} else {
		const error = response
		switch (error.statusCode) {
		case 400: error.retmsg = '请求错误'; break;
		case 401: error.retmsg = '未授权，请登录';break;
		case 403: error.retmsg = '拒绝访问'; break;
		case 404: error.retmsg = `请求地址出错`; break;
		case 408: error.retmsg = '请求超时'; break;
		case 429: error.retmsg = '请求失败，服务器内部错误'; break;
		case 500: error.retmsg = '服务器内部错误'; break;
		case 501: error.retmsg = '服务未实现'; break;
		case 502: error.retmsg = '网关错误'; break;
		case 503: error.retmsg = '服务不可用'; break;
		case 504: error.retmsg = '网关超时'; break;
		case 505: error.retmsg = 'HTTP版本不受支持'; break;
		default: error.retmsg = '服务器内部错误';break;
		}
		error.retcode = error.statusCode
		error.retmsg = error.msg
		errorCreate(error)
		return Promise.reject(error.data);
	}
	
})

export default service